多模态 AI 应用开发指南
多模态 AI 能够同时处理文本、图像、音频等多种数据类型,提供更丰富的交互体验。本文详细介绍如何使用 OpenClaw 开发多模态 AI 应用,包含 4 个实战案例。
一、多模态基础概念
什么是多模态?
多模态 AI 指能够理解和生成多种媒体类型的人工智能系统:
- 文本:自然语言处理(NLP)
- 图像:计算机视觉(CV)
- 音频:语音识别和合成
- 视频:时序视觉分析
- 结构化数据:表格、数据库
OpenClaw 多模态工具
| 工具 | 功能 | 支持格式 |
|---|---|---|
image | 图像分析 | jpg, png, gif, webp |
pdf | PDF 文档处理 | |
web_fetch | 网页内容提取 | HTML → Markdown |
exec | 音频/视频处理 | 通过 ffmpeg 等工具 |
二、实战案例 1:智能图片分析
场景说明
自动分析用户上传的图片,提供详细描述和建议。
完整实现
javascript
// 图片分析函数
async function analyzeImage(imagePath) {
// 1. 基础分析
const basicAnalysis = image(
image=imagePath,
prompt="详细描述这张图片的内容,包括场景、物体、人物、动作等"
)
// 2. 情感分析
const emotionAnalysis = image(
image=imagePath,
prompt="分析这张图片传达的情感和氛围(积极/消极/中性)"
)
// 3. 实用建议
const practicalAdvice = image(
image=imagePath,
prompt="基于这张图片,提供实用的建议或行动项"
)
// 4. 生成报告
const report = \`
# 图片分析报告
## 内容描述
\${basicAnalysis}
## 情感分析
\${emotionAnalysis}
## 实用建议
\${practicalAdvice}
## 元数据
- 文件:\${imagePath}
- 分析时间:\${new Date().toLocaleString('zh-CN')}
- AI 模型:视觉模型 v3.5
\`
return report
}
// 使用示例
const report = await analyzeImage("./user-upload.jpg")
message(action="send", message=report, media="./user-upload.jpg")输出示例
# 图片分析报告
## 内容描述
这是一张办公室工作场景的照片。画面中有:
- 一位年轻女性坐在办公桌前
- 桌面上有笔记本电脑、咖啡杯、笔记本
- 背景是现代化的开放式办公室
- 光线充足,色调温暖
## 情感分析
整体情感倾向:积极
- 专注的工作状态
- 舒适的工作环境
- 温暖的光线营造安全感
## 实用建议
1. **工作效率**:当前状态适合深度工作,建议保持专注
2. **健康提醒**:记得每小时起身活动,保护视力
3. **环境优化**:可以添加绿植提升工作环境三、实战案例 2:文档智能处理
场景说明
处理 PDF 技术文档,提取关键信息并生成摘要。
完整实现
javascript
// 文档处理函数
async function processDocument(pdfPath) {
// 1. 整体概览
const overview = pdf(
pdf=pdfPath,
prompt="提供这份文档的整体概览,包括章节结构和核心主题"
)
// 2. 提取关键技术点
const keyPoints = pdf(
pdf=pdfPath,
prompt="提取文档中的关键技术点、架构图、API 接口等重要信息"
)
// 3. 生成学习路径
const learningPath = pdf(
pdf=pdfPath,
prompt="基于这份文档,为初学者制定一个循序渐进的学习路径"
)
// 4. 创建代码示例
const codeExamples = pdf(
pdf=pdfPath,
prompt="从文档中提取关键代码示例,并添加详细注释"
)
// 5. 生成问答对
const qaPairs = pdf(
pdf=pdfPath,
prompt="基于文档内容,生成 5 个常见问题及其答案"
)
// 6. 整合报告
const report = \`
# 文档智能处理报告
## 文档概览
\${overview}
## 关键技术点
\${keyPoints}
## 学习路径
\${learningPath}
## 代码示例
\`\`\`javascript
\${codeExamples}
\`\`\`
## 常见问题
\${qaPairs}
---
处理完成时间:\${new Date().toLocaleString('zh-CN')}
\`
return report
}
// 批量处理
async function batchProcessDocuments(pdfPaths) {
const reports = []
for (const pdfPath of pdfPaths) {
try {
const report = await processDocument(pdfPath)
reports.push({ file: pdfPath, report })
// 保存报告
const reportPath = pdfPath.replace('.pdf', '-analysis.md')
write(path=reportPath, content=report)
} catch (e) {
console.log(\`处理失败 \${pdfPath}: \${e.message}\`)
}
// 避免请求过快
if (pdfPaths.indexOf(pdfPath) < pdfPaths.length - 1) {
exec(command="sleep 2")
}
}
return reports
}四、实战案例 3:网页内容聚合
场景说明
从多个网页抓取内容,聚合生成综合报告。
完整实现
javascript
// 网页聚合函数
async function aggregateWebContent(urls) {
const contents = []
// 1. 并行抓取网页
for (const url of urls) {
try {
const content = web_fetch(
url=url,
extractMode="markdown",
maxChars=3000
)
contents.push({ url, content })
} catch (e) {
console.log(\`抓取失败 \${url}: \${e.message}\`)
}
}
// 2. 内容去重
const uniqueContents = deduplicateContents(contents)
// 3. 生成综合报告
const aggregatedReport = \`
# 网页内容聚合报告
## 数据源
- 总链接数:\${urls.length}
- 成功抓取:\${uniqueContents.length}
- 去重后:\${uniqueContents.length}
## 综合分析
\${uniqueContents.map((item, i) => \`
### 来源 \${i+1}: \${item.url}
\${item.content.substring(0, 500)}...
\`).join('\\n')}
## 核心观点
\${generateKeyInsights(uniqueContents)}
## 行动建议
\${generateActionableAdvice(uniqueContents)}
\`
return aggregatedReport
}
// 去重函数
function deduplicateContents(contents) {
const unique = []
for (const content of contents) {
const isDuplicate = unique.some(u =>
similarity(content.content, u.content) > 0.8
)
if (!isDuplicate) {
unique.push(content)
}
}
return unique
}
// 相似度计算(简化版)
function similarity(text1, text2) {
const words1 = new Set(text1.split(' '))
const words2 = new sets(text2.split(' '))
const intersection = [...words1].filter(word => words2.has(word))
const union = new Set([...words1, ...words2])
return intersection.length / union.size
}五、实战案例 4:多模态客服系统
场景说明
支持文本、图片、文档等多种输入的智能客服。
完整实现
javascript
// 多模态客服类
class MultimodalCustomerService {
constructor() {
this.supportedTypes = ['text', 'image', 'pdf', 'url']
}
// 处理用户消息
async handleUserMessage(message, attachments = []) {
// 1. 分析消息类型
const messageType = this.detectMessageType(message, attachments)
// 2. 路由到相应处理器
switch (messageType) {
case 'text':
return await this.handleTextMessage(message)
case 'image':
return await this.handleImageMessage(attachments[0])
case 'pdf':
return await this.handlePdfMessage(attachments[0])
case 'url':
return await this.handleUrlMessage(message)
default:
return "抱歉,暂时不支持这种消息类型。请发送文本、图片、PDF 或网页链接。"
}
}
// 文本消息处理
async handleTextMessage(text) {
// 使用常规 AI 处理
return aiResponse(text)
}
// 图片消息处理
async handleImageMessage(imagePath) {
const analysis = image(
image=imagePath,
prompt="分析用户上传的图片,理解其意图,并提供相关帮助"
)
return \`
图片分析结果:
\${analysis}
如果需要进一步帮助,请告诉我具体问题。
\`
}
// PDF 消息处理
async handlePdfMessage(pdfPath) {
const summary = pdf(
pdf=pdfPath,
prompt="总结用户上传的 PDF 文档的主要内容,并询问是否需要特定帮助"
)
return \`
文档摘要:
\${summary}
我可以帮您:
- 详细解释某个部分
- 提取特定信息
- 生成学习笔记
- 转换为其他格式
请告诉我您的需求。
\`
}
// URL 消息处理
async handleUrlMessage(url) {
const content = web_fetch(url=url, maxChars=2000)
const summary = summarizeContent(content)
return \`
网页内容摘要:
\${summary}
我可以帮您:
- 深入分析特定方面
- 对比其他资源
- 生成相关问题
- 保存到知识库
需要什么帮助?
\`
}
// 消息类型检测
detectMessageType(message, attachments) {
if (attachments.length > 0) {
const ext = attachments[0].split('.').pop().toLowerCase()
if (['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(ext)) {
return 'image'
} else if (ext === 'pdf') {
return 'pdf'
}
}
if (message.startsWith('http')) {
return 'url'
}
return 'text'
}
}
// 使用示例
const service = new MultimodalCustomerService()
// 处理不同类型的用户消息
await service.handleUserMessage("你好") // 文本
await service.handleUserMessage("", ["./screenshot.png"]) // 图片
await service.handleUserMessage("", ["./manual.pdf"]) // PDF
await service.handleUserMessage("https://example.com") // URL六、高级技巧
1. 模态融合
javascript
// 结合图片和文本分析
async function multimodalAnalysis(imagePath, contextText) {
// 图片分析
const imageAnalysis = image(image=imagePath, prompt="描述图片内容")
// 结合上下文分析
const combinedAnalysis = \`
基于以下上下文和图片,提供综合分析:
上下文:\${contextText}
图片内容:\${imageAnalysis}
综合分析:
\`
return combinedAnalysis
}2. 批量处理优化
javascript
// 控制并发数量
async function batchProcessWithConcurrency(items, processor, concurrency=3) {
const results = []
for (let i = 0; i < items.length; i += concurrency) {
const batch = items.slice(i, i + concurrency)
const batchResults = await Promise.all(
batch.map(item => processor(item))
)
results.push(...batchResults)
}
return results
}3. 错误处理和降级
javascript
// 多模态降级策略
async function robustMultimodalProcessing(input) {
try {
// 尝试主要模态
return await primaryProcessor(input)
} catch (e) {
console.log(\`主处理器失败:\${e.message}\`)
try {
// 尝试备用模态
return await fallbackProcessor(input)
} catch (e2) {
// 返回错误信息
return \`处理失败:\${e.message},备用方案也失败:\${e2.message}\`
}
}
}七、常见问题
Q: 如何处理大文件?
A:
- 图片:限制大小(<10MB)
- PDF:分页处理(pages 参数)
- 网页:限制字符数(maxChars)
Q: 模态之间如何协作?
A:
- 先处理主要模态
- 用结果作为上下文处理其他模态
- 最终整合所有结果
Q: 如何保证处理质量?
A:
- 设置合理的超时时间
- 添加重试机制
- 人工复核关键结果
八、总结
多模态 AI 让应用更智能、更自然:
| 模态 | 应用场景 | 工具 |
|---|---|---|
| 图像 | 视觉分析、OCR | image |
| 文档处理、知识提取 | ||
| 网页 | 信息聚合、竞品分析 | web_fetch |
| 文本 | 常规对话、内容生成 | message |
掌握多模态开发,打造真正的智能应用!
相关资源: